Q-4: LinearLayout vs RelativeLayout OR Context Menu Implementation (5 Marks)
Questions​
i) Design a user interface using LinearLayout and RelativeLayout. Explain the difference between them.
ii) Implement a context menu in an Android application and demonstrate its functionality.
Answers​
i) LinearLayout vs RelativeLayout Design and Differences​
LinearLayout Design Example​
<!-- LinearLayout Example: Vertical Login Form -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login Form"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="32dp" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Username"
android:layout_marginBottom="16dp" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword"
android:layout_marginBottom="24dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Login"
android:layout_marginEnd="8dp" />
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_marginStart="8dp" />
</LinearLayout>
</LinearLayout>
RelativeLayout Design Example​
<!-- RelativeLayout Example: Profile Layout -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<ImageView
android:id="@+id/profileImage"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_profile"
android:layout_marginTop="32dp" />
<TextView
android:id="@+id/nameText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/profileImage"
android:layout_centerHorizontal="true"
android:text="John Doe"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginTop="16dp" />
<TextView
android:id="@+id/emailText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/nameText"
android:layout_centerHorizontal="true"
android:text="john@example.com"
android:layout_marginTop="8dp" />
<Button
android:id="@+id/editButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/emailText"
android:layout_alignParentStart="true"
android:text="Edit Profile"
android:layout_marginTop="32dp" />
<Button
android:id="@+id/logoutButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/emailText"
android:layout_alignParentEnd="true"
android:text="Logout"
android:layout_marginTop="32dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Version 1.0"
android:textSize="12sp"
android:layout_marginBottom="16dp" />
</RelativeLayout>
Key Differences​
Aspect | LinearLayout | RelativeLayout |
---|---|---|
Organization | Sequential (linear) arrangement | Relative positioning to other views |
Orientation | Horizontal or Vertical | No specific orientation |
Positioning | Based on order in XML | Based on relationship rules |
Flexibility | Limited positioning options | Highly flexible positioning |
Performance | Better performance | Slower due to multiple measurement passes |
Nesting | Often requires nesting for complex layouts | Can achieve complex layouts without nesting |
Use Case | Simple, sequential layouts | Complex, overlapping layouts |
Positioning Attributes​
LinearLayout:
android:orientation
: vertical/horizontalandroid:layout_weight
: distribute space proportionallyandroid:gravity
: align children within the layoutandroid:layout_gravity
: align view within parent
RelativeLayout:
android:layout_above
: position above another viewandroid:layout_below
: position below another viewandroid:layout_toLeftOf
: position to left of another viewandroid:layout_toRightOf
: position to right of another viewandroid:layout_alignParentTop
: align to parent's topandroid:layout_centerInParent
: center in parent
ii) Context Menu Implementation​
Step 1: Register View for Context Menu​
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
items = new ArrayList<>();
items.add("Item 1");
items.add("Item 2");
items.add("Item 3");
adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
// Register for context menu
registerForContextMenu(listView);
}
}
Step 2: Create Context Menu​
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// Inflate menu from XML
getMenuInflater().inflate(R.menu.context_menu, menu);
// Or create programmatically
menu.setHeaderTitle("Select Action");
menu.add(0, 1, 0, "Edit");
menu.add(0, 2, 0, "Delete");
menu.add(0, 3, 0, "Share");
}
Step 3: Create Menu Resource File​
res/menu/context_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_edit"
android:title="Edit" />
<item
android:id="@+id/menu_delete"
android:title="Delete" />
<item
android:id="@+id/menu_share"
android:title="Share" />
<item
android:id="@+id/menu_copy"
android:title="Copy" />
</menu>
Step 4: Handle Menu Item Selection​
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int position = info.position;
String selectedItem = items.get(position);
switch (item.getItemId()) {
case R.id.menu_edit:
editItem(position, selectedItem);
return true;
case R.id.menu_delete:
deleteItem(position);
return true;
case R.id.menu_share:
shareItem(selectedItem);
return true;
case R.id.menu_copy:
copyItem(selectedItem);
return true;
default:
return super.onContextItemSelected(item);
}
}
Step 5: Implement Action Methods​
private void editItem(int position, String item) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Edit Item");
final EditText input = new EditText(this);
input.setText(item);
builder.setView(input);
builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String newText = input.getText().toString();
items.set(position, newText);
adapter.notifyDataSetChanged();
}
});
builder.setNegativeButton("Cancel", null);
builder.show();
}
private void deleteItem(int position) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Delete Item")
.setMessage("Are you sure you want to delete this item?")
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
items.remove(position);
adapter.notifyDataSetChanged();
}
})
.setNegativeButton("Cancel", null)
.show();
}
private void shareItem(String item) {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, item);
startActivity(Intent.createChooser(shareIntent, "Share via"));
}
private void copyItem(String item) {
ClipboardManager clipboard = (ClipboardManager)
getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Copied Item", item);
clipboard.setPrimaryClip(clip);
Toast.makeText(this, "Item copied to clipboard", Toast.LENGTH_SHORT).show();
}
Alternative: Floating Context Menu​
// For floating context menu (older approach)
public void showContextMenu(View view) {
PopupMenu popup = new PopupMenu(this, view);
popup.getMenuInflater().inflate(R.menu.context_menu, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
// Handle menu item clicks
return true;
}
});
popup.show();
}
Benefits of Context Menus​
- Space Efficiency: Don't take permanent screen space
- Contextual Actions: Actions relevant to selected item
- User Experience: Familiar interaction pattern
- Accessibility: Support for different interaction methods